#include "mytools.h"
#include <QString>
#include <QFile>
#include <QDebug>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>
#include <QMessageBox>

MyTools::MyTools()
{

}

/**
 * @brief MyTools::read_json 对json文件内的通讯协议进行处理
 * @param path
 * @param key
 */
QByteArray MyTools::read_json(QString path, QString key)
{
    QFile file(path);
    if(!file.open(QIODevice::ReadOnly))             //这里没有写文件，都是读文件内容，所以不需要设置线程锁来保证每次只有一个线程对其进行操作
    {
        qDebug()<<"打开失败！";
        exit(1);                //终止程序
    }
    qDebug()<<"打开成功！";
    QJsonParseError jsonParserError;
    QJsonDocument jsonDecument = QJsonDocument::fromJson(file.readAll(), &jsonParserError);
    file.close();
    qDebug()<<"1111111:   "<<jsonParserError.error<< "  "<<jsonDecument.isNull();
    if(!jsonDecument.isNull() && jsonParserError.error==QJsonParseError::NoError)       //判断读取的内容是否有误
    {
        qDebug()<<"文件解析成功";
        if(jsonDecument.isObject())             //这里明天再看看，博客说里面封装了Json中的对象
        {
            QJsonObject jsonObject = jsonDecument.object();
//            if(jsonObject.contains(key))                                  //尝试读取数值
//            {
//                qDebug()<<key<<"  :  "<<jsonObject.value(key);
//            }
            if(jsonObject.contains(key) && jsonObject.value(key).isArray()) //读取数组
            {
                QJsonArray jsonArray = jsonObject.value(key).toArray();
                QByteArray data_arr;
                //unsigned char *readyToCTC;
                unsigned char readyToCTC[jsonArray.size()];
                for(int i=0; i<jsonArray.size(); i++)
                {
//                    qDebug()<<jsonArray[i].toInt();
                    //QString qnum = QString::number(jsonArray[i].toInt(), 16).right(2);
                    QString qnum = "0x"+QString("%1").arg(jsonArray[i].toInt(), 2, 16, QLatin1Char('0'));  // 保留两位，不足补零
                    unsigned char buff = (unsigned char)(jsonArray[i].toInt());
                    data_arr.append(buff);
                    readyToCTC[i] = buff;
                    //qDebug()<<data_arr;
                }
                unsigned int crc_value = crc_cjl_value(readyToCTC, jsonArray.size());       //unsigned int貌似就两个字节
                unsigned char low_crc = (unsigned char)crc_value;
                unsigned char high_crc = (unsigned char)(crc_value>>8);              //不知道为啥，这里也许要加上unsigned，否则结果不对
                qDebug()<<" crc_value    "<<crc_value<< " low_crc  "<<low_crc<<" high_crc   "<<high_crc;
                data_arr.append(high_crc);
                data_arr.append(low_crc);       //超过一定数值之后，会根据ASCII对应的字母 打印出来结果，如100虽然可以以0x64显示，但系统会以"b"的形式显示char型字符
                return data_arr;
            }
        }
    }
    QMessageBox::warning(this, "json文件异常", "读取json文件的协议内容失败，请检查json文件", QMessageBox::Button::Ok);
    return NULL;
}

/**
 * @brief SubWidget1::crc_cjl_value 计算crc用
 * @param data_value        这里的指针就是代指的传数组名而已
 * @param length
 * @return
 */
unsigned int MyTools::crc_cjl_value(unsigned char *data_value, unsigned char length)
{
    unsigned int crc_value = 0xffff;
    int i;
    while(length--)
    {
        crc_value^=*data_value++;
        for(i=0; i<8; i++)
        {
            if(crc_value&0x0001)
            {
                crc_value = (crc_value>>1)^0xa001;
            }
            else
            {
                crc_value = (crc_value>>1);
            }
        }
    }
    return crc_value;
}

/**
 * @brief MainWindow::qss_style
 * @param w 这里变量a的类型暂时用m_w1、m_w2、m_w3_Serial共同的父类来作为容器存储，其实我们的a也就是一个容器，存了变量的引用
 * @param path qss文件的路径
 */
void MyTools::qss_style(QWidget &w, QString path)
{
    QFile file(path);
    if(file.open(QFile::ReadOnly))                 //打开文件-以只读的方式
    {
        QString styleSheet = tr(file.readAll());    //读文件内容，并转为QString
        qDebug()<<"3333333333333333";
        //qDebug()<<styleSheet;
        w.setStyleSheet(styleSheet);
        file.close();
    }
    else
    {
        QMessageBox::warning(NULL, "warning", "Open failed", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
    }
}
//void MainWindow::qss_style()
//{
//    QFile file(":/qrc/subwidget2.qss");
//    if( file.open(QFile::ReadOnly))
//      {
//          qDebug("open success");
//          QString style = tr(file.readAll());
//          m_w2->setStyleSheet(style);
//          m_w3_Serial->setStyleSheet(style);
//          qDebug()<<style;
//          file.close();
//      }
//      else
//      {
//     qDebug("Open failed");
//    }

//}
